#pragma once
/****************************************************************************
 * 文件内容: 文件定义了项目业务线对象的基类。后续在项目的业务线对象中，需要继承这个类。
 * 1.该类继承业务线的接口类型Pipeline, 实现了接口类的公共调用函数
 ****************************************************************************/
#include "Pipeline.h"

#include "pipeline_data.h"
#include "systemjournal.h"

class PathBuild;
using namespace pipeline;
class PipelineBase : public Pipeline
{
public:
	PipelineBase();
	~PipelineBase();
	/****************************************************************************
	 * 功能: 业务线初始化接口
	 * 传参: id: 业务线编号
	 ****************************************************************************/
	virtual bool PipelineInit(const QString& id);


	/****************************************************************************
	 * 功能: 校验任务数据是否和业务线相匹配，任务数据的解析和匹配校验，各个项目存在差异，此处不实现
	 * 传参: task: 任务数据参数
	 * 返回值: 0: 表示匹配成功，可以执行，1：匹配成功，但是业务线存在执行中的任务，-1：表示匹配失败。
	 ****************************************************************************/
	virtual int IfTaskAvailable(const QByteArray& task) = 0;

	/****************************************************************************
	 * 功能: 任务初始化操作，由项目具体实现
	 * 返回值: true：执行成功，业务线切换到任务初始化完成状态
	 ****************************************************************************/
	virtual bool TaskInit() = 0;

	/****************************************************************************
	 * 功能: 判断任务启动条件是否具备
	 * 返回值:true：任务可以启动，业务线切换到任务开始状态
	 ****************************************************************************/
	virtual bool IfTaskStarted() = 0;

	/****************************************************************************
	 * 功能: 判断任务是否准备完成
	 * 返回值: true: 任务已经准备完成，直接进入任务等待状态
	 ****************************************************************************/
	virtual bool IfTaskPrepared() = 0;

	/****************************************************************************
	 * 功能: 用于生成新节拍
	 * 返回值: 0：节拍生成成功，业务线切换到节拍准备完成状态，1：生成条件不足， -1：生成失败
	 ****************************************************************************/
	virtual int StepPrepare() = 0;

	/****************************************************************************
	 * 功能: 判断节拍启动条件是否具备
	 * 返回值:true：节拍可以启动
	 ****************************************************************************/
	virtual bool IfStepStarted();

	/****************************************************************************
	 * 功能: 判断节拍路径是否全部完成，由节拍调用线程调用
	 * 返回值:true：节拍路径全部完成
	 ****************************************************************************/
	virtual bool IfStepPathEmpty();

	/****************************************************************************
	 * 功能: 判断节拍路径下发完成处理函数
	 * 返回值:true：节拍路径全部完成
	 ****************************************************************************/
	virtual bool StepExecuteFinish();

	/****************************************************************************
	 * 功能:	获取当前节拍下一条可执行路径， 由节拍调用线程调用
	 * 返回值: true:获取成功
	 ****************************************************************************/
	virtual bool GetNextExecPath(QString& path);

	/****************************************************************************
	 * 功能: 判断任务是否完成，任务完成等待状态被调用
	 * 返回值: true: 表示任务完成
	 ****************************************************************************/
	virtual bool IfTaskFinished();

	/****************************************************************************
	 * 功能: 任务完成处理操作， 任务完成状态时被调用
	 * 返回值: true 表示成功
	 ****************************************************************************/
	virtual bool TaskFinish() = 0;

	/****************************************************************************
	 * 功能: 任务状态获取/设置接口
	 ****************************************************************************/
	virtual PipelineTaskState GetPipelineTaskState() override;
	virtual bool SetPipelineTaskState(PipelineTaskState state) override;

	/*路径执行前操作*/
	virtual bool PathStart(const QString& path) = 0;
	/*路径完成操作*/
	virtual bool PathFinished(const QString& path);

	virtual bool PathAction(int type, const QString& param);
	/*业务线名称获取*/
	virtual QString GetPipelineId()	override;
	virtual PipelineInfo GetPipelinenfo() override;

	/*业务线错误信息获取*/
	virtual QString GetErrorMsg() override;
	virtual bool IsError() { return m_pipeError; }
	/*业务线任务信息获取*/
	virtual PipelineTaskInfo GetPipelineTaskInfo() override;

	/*任务信息处理接口*/
	virtual bool DeleteTaskInfo() override;
	virtual bool ChangTaskFinishNum(int num) override;
	virtual bool TaskContinue() override;
	virtual bool ManualTaskFinish() override;
protected:
	virtual bool Init() = 0;
	/*拍照动作执行*/
	virtual bool TakePicture() { return false; }
	virtual bool SendNotifyer(int type) { return false; }
	/*路径执行后特殊操作*/
	virtual bool PathEnd(const QString& path) = 0;

	virtual bool AddPathListToPrepareStepInfo(const QString& pathstr);

protected:
	/*设置业务的错误状态*/
	virtual void ClearErrorState() override;
	virtual void SetPipelineErrorState(const QString& err);
	void SetTraceMassage(const QString& str);
	void SetErrorMassage(const QString& str);

	void DataInit();

protected:
	/*基础状态信息*/
	PipelineInfo m_info = {};

	bool m_pipeError = false;	// 业务线是否异常
	QString m_errmsg;
	PipelineTaskState m_state = PipelineTaskState::pipeline_task_idle;

	/*调用工具信息*/
	PathBuild* m_pathBuild = nullptr;
	SystemJournal m_writer;
	/*任务信息*/
	TaskInfo m_task = {};
	SkuInfo m_sku = {};
	ExecuteInfo m_exec = {};

	/*节拍信息*/
	StepInfo m_waitFinishStep = {};	// 等待执行完成的节拍
	StepInfo m_execStep = {};	// 正在执行的节拍
	StepInfo m_prepareStep = {};	// 准备中的节拍

};
